package org.ejb.stateless;


import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.ejb.api.UtilisateurInterface;
import org.ejb.entities.Address;
import org.ejb.entities.Annonce;
import org.ejb.entities.OrderParFois;
import org.ejb.entities.Utilisateur;
import org.ejb.entities.ValidationException;

import java.util.List;
import java.util.logging.Logger;

/**
 * This class is a facade for all customer services.
 */
@SuppressWarnings(value = "unchecked")
@TransactionAttribute(value = TransactionAttributeType.REQUIRED)
@Stateless(mappedName = "org.ejb.stateless.UtilisateurStateless@Remote", description = "Utilisateur stateless", name = "UtilisateurStateless")
public class UtilisateurStateless implements UtilisateurInterface{

    // ======================================
    // =             Attributs              =
    // ======================================
    @PersistenceContext
    private EntityManager em;

    private final String cname = this.getClass().getName();
    private Logger logger = Logger.getLogger("org.ejb.stateless");

    // ======================================
    // =          Methodes publiques        =
    // ======================================
//    public Utilisateur authenticate(final String login, final String password) {
//        final String mname = "authenticate";
//        logger.entering(cname, mname, new Object[]{login, password});
//
//        // On s'assure de la validite des paramatres
//        if (login == null || "".equals(login))
//            throw new ValidationException("Invalid login");
//
//        Query query;
//        Utilisateur customer;
//
//        // On recherche l'objet a partir de son login
//        query = em.createQuery("SELECT c FROM User c WHERE c.login=:login");
//        query.setParameter("login", login);
//        customer = (Utilisateur) query.getSingleResult();
//
//        // Check if it's the right password
//        if (customer != null)
//            customer.matchPassword(password);
//
//        logger.exiting(cname, mname, customer);
//        return customer;
//    }

    public Utilisateur createCustomer(Utilisateur customer, Address address) {
        final String mname = "createCustomer";
        logger.entering(cname, mname, customer);

        // On s'assure de la validite des paramatres
        if (customer == null) throw new ValidationException("Customer object is null");
        if (address == null) throw new ValidationException("Address object is null");
        //address.setUtilisateur(customer);
        customer.setAddress(address);
        em.persist(address);
        em.persist(customer);
        em.flush();
        
        logger.exiting(cname, mname, customer);
        return customer;
    }
    
    public Utilisateur findCustomer(final Long customerId) {
        final String mname = "findCustomer";
        logger.entering(cname, mname, customerId);

        // On s'assure de la validite des paramatres
        if (customerId == null)
            throw new ValidationException("Invalid id");

        Utilisateur customer;

        // On recherche l'objet a partir de son identifiant
        customer = em.find(Utilisateur.class, customerId);

        logger.exiting(cname, mname, customer);
        return customer;
    }

    public void deleteCustomer(final Utilisateur customer) {
        final String mname = "deleteCustomer";
        logger.entering(cname, mname, customer);

        // On s'assure de la validite des paramatres
        if (customer == null)
            throw new ValidationException("Customer object is null");

        // On supprime l'objet de la base de donnees
        em.remove(em.merge(customer));

        logger.exiting(cname, mname);
    }

    public Utilisateur updateCustomer(final Utilisateur customer, final Address address) {
        final String mname = "updateCustomer";
        logger.entering(cname, mname, customer);

        // On s'assure de la validite des paramatres
        if (customer == null)
            throw new ValidationException("Customer object is null");

        customer.setAddress(address);

        // On modifie l'objet de la base de donnees
        em.merge(customer);
        em.flush();

        logger.exiting(cname, mname, customer);
        return customer;
    }

    public List<Utilisateur> findCustomersList() {
        final String mname = "findCustomers";
        logger.entering(cname, mname);

        Query query;
        List<Utilisateur> customers;

        // On modifie l'objet de la base de donnees
        query = em.createQuery("SELECT u FROM Utilisateur u");
        customers = query.getResultList();

        logger.exiting(cname, mname, customers.size());
        return customers;
    }

    /** ******************************************************************************************/
    /** Un annonce est cree par un utilisateur, on note utilisateur_id dans un colonne d'annonce */
    public void ajouteAnnonce(Utilisateur customer, Annonce annonce){
    	final String mname = "ajouterAnnonce";
        logger.entering(cname, mname, customer);
        
        // On s'assure de la validite des paramatres
        if (customer == null) throw new ValidationException("Customer object is null");
        if (annonce == null) throw new ValidationException("Annonce object is null");
        
        annonce.setUtilisateur(customer);
        em.persist(annonce);
        
        logger.exiting(cname, mname, customer);
    }    
   
//    /** ******************************************************************************************/
//    /** Un annonce est cree par un utilisateur, on note utilisateur_id dans un colonne d'annonce */
//    public void ajouteLocation(Utilisateur customer, Location location){
//    	final String mname = "ajouterLocation";
//        logger.entering(cname, mname, location);
//        
//        // On s'assure de la validite des paramatres
//        if (customer == null) throw new ValidationException("Customer object is null");
//        if (location == null) throw new ValidationException("Location object is null");
//        
//        location.setUtilisateur(customer);
//        em.persist(location);
//        
//        logger.exiting(cname, mname, location);    	
//    }
    
      /** **************************************************************************************/
      /** un order est cree par un utilisateur, on note utilisateur_id dans un colonne d'order */
//    public void commandeOrder(Utilisateur customer, OrderParFois orderParFois){
//  	  final String mname = "ajouterOrder";
//  	  logger.entering(cname, mname, orderParFois);
//      
//      	// On s'assure de la validite des paramatres
//      	if (customer == null) throw new ValidationException("Customer object is null");
//      	if (orderParFois == null) throw new ValidationException("Location object is null");
//      
//      	orderParFois.setUtilisateur(customer);
//      	em.persist(orderParFois);
//      
//      	logger.exiting(cname, mname, orderParFois);    	 
//    }

      // d'abord persister d'address, apres l'utilisateur ciliqer le panier pour il persiste l'utilisateur
//    public void ajouteOrderParFoisAddress(OrderParFois orderParFois, Address deliveryAddress){
//  	  final String mname = "ajouterOrderParFoisAddress";
//  	  logger.entering(cname, mname, orderParFois);
//      
//      	// On s'assure de la validite des paramatres
//      	if (orderParFois == null) throw new ValidationException("OrderParFois object is null");
//      	if (deliveryAddress == null) throw new ValidationException("DeliveryAddress object is null");
//      
//      	orderParFois.setDeliveryAddress(deliveryAddress);
//      	em.persist(deliveryAddress);
//      	em.persist(orderParFois);
//      	
//      	logger.exiting(cname, mname, orderParFois);    	 
//    }

      public void ajouteOrderParFois(Utilisateur customer, OrderParFois orderParFois, Address deliveryAddress){
    	  final String mname = "ajouterOrderParFois";
    	  logger.entering(cname, mname, orderParFois);
        
        	// On s'assure de la validite des paramatres
        	if (customer == null) throw new ValidationException("Customer object is null");
        	if (orderParFois == null) throw new ValidationException("OrderParFois object is null");
        	if (deliveryAddress == null) throw new ValidationException("DeliveryAddress object is null");
        
        	orderParFois.setUtilisateur(customer);
        	orderParFois.setDeliveryAddress(deliveryAddress);
        	em.persist(deliveryAddress);
        	//em.flush();
        	em.persist(orderParFois);
        	
        	logger.exiting(cname, mname, orderParFois);    	 
      }

}
